// WorkHistory.h: interface for the CWorkHistory class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WORKHISTORY_H__93A0F6C9_A6F2_4DCC_A5E3_5B53FABF9FDC__INCLUDED_)
#define AFX_WORKHISTORY_H__93A0F6C9_A6F2_4DCC_A5E3_5B53FABF9FDC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


// C++ STL의 vector 컨테이너를 사용한다.
#include <vector>
using namespace std;

// CDrawingNode 클래스를 사용한다.
#include "DrawingNode.h"


/**
	CWorkHistory
	작업노드를 관리하는 클래스이다.
	CDrawingNode* 들을 관리한다.
	Undo,Redo를 지원한다. (핵심 기능)
	Cache를 지원한다.
*/
class CWorkHistory  
{
private:
	void RedrawCache();
	bool m_bHasCache;
	CSize m_sizeImage;
	enum { VECTOR_SIZE_RESERVED = 500 };// 총 노드를 넣을 갯수 메모리 예약.
	vector<CDrawingNode*> m_History;	// CDrawingNode들을 관리하기 위한 Vector
	int m_nHistorySize;					// 현재 큐의 논리적 사이즈를 정한다. (실제 사이즈가 아님)
	COLORREF m_bkColor;					// 초기의 백그라운드 색상
	
	// 캐쉬를 위한 것
	CBitmap m_bmpCache;					// 마지막 장면을 기록해둘 비트맵
	CBitmap* m_pbmpOld;					// 예전의 bmp를 저장해놓을 포인터 변수
	CDC m_CacheDC;						// m_bmpCache와 연결해놓을 메모리 DC
	
	void DeleteAllNodes();				// 모든 노드를 삭제한다.
	void InitCache(CDC* pDC);			// 캐쉬 설정
	
public:
	CDC* GetCacheDC();
	void Initialize(COLORREF bkColor, CSize size);	// 초기화
	void Draw(CDC* pDC);				// 캐쉬를 pDC에 그려준다.
	void AddNode(CDrawingNode* pNode);	// 새 CDrawingNode를 추가한다.
	bool Undo();						// 가능하다면, 한 단계 Undo한다.
	bool Redo();						// 가능하다면, 한 단계 Redo한다.
	bool IsUndoPossible();				// Undo가 가능한지 확인한다.
	bool IsRedoPossible();				// Redo가 가능한지 확인한다.
	CWorkHistory();
	virtual ~CWorkHistory();
};

#endif // !defined(AFX_WORKHISTORY_H__93A0F6C9_A6F2_4DCC_A5E3_5B53FABF9FDC__INCLUDED_)
